#ifndef __PROTOCOL_H__
#define __PROTOCOL_H__
#include "esp_common.h"

#define FILE_BUF_SIZE    512

#define SYS_CPU_TYPE     3 //协议中CPU类型
typedef enum
{
	Cmd_DevRegReq = 0x01,
	Cmd_DevRegAck = 0x81,
	Cmd_askEvtReq = 0x02,
	Cmd_askEvtAck = 0x82,
	cmd_fileInfoReq = 0x03,
	Cmd_fileInfoAck = 0x83,
	Cmd_fileDataReq = 0x04,
	Cmd_fileDataAck = 0x84,
	Cmd_fileFinshReq = 0x05,
	Cmd_fileFinshAck = 0x85,
	Cmd_askCycModReq = 0x06,
	Cmd_askCycModAck = 0x86,
	Cmd_modURLReq = 0x07,
	Cmd_modURLAck = 0X87,
	Cmd_modFinshReq = 0x08,
	Cmd_modFinshAck = 0x88,
}CmdTyteDef;

enum askEvttype
{
	Ask_PIC = (0X01 << 0),//询问图片更新
	Ask_Gap = (0X01 << 1),//询问更新间隔
	Ask_URL = (0X01 << 2),//询问url更新
	Ask_Upgrade = (0X01 << 3),//系统升级
};

typedef struct 
{
	u8_t len[2];//包长度
	u8_t cmd;//报文类型
	u8_t cpu;//CPU类型
	u8_t id[12];//设备硬件ID
	u8_t vbat;//电池剩余百分比
	s8_t csq;//信号质量
	u8_t devType;//产品类型
	u8_t crc[2];
}devRegReqDef;//注册设备请求

typedef struct 
{
	u8_t len[2];//包长度
	u8_t cmd;//报文类型
	u8_t date[4];//系统时间
	u8_t result;//结果
	u8_t mac[4];//系统分配的设备ID
	u8_t crc[2];
}devRegAckDef;//注册设备应答

typedef struct 
{
	u8_t len[2];//包长度
	u8_t cmd;//报文类型
	u8_t id[4];//设备id
	u8_t vbat;//电池
	s8_t  csq;//信号
	u8_t flow[4];//流量
	u8_t charge[2];
	u8_t crc[2];
}askEvtReqDef;//事件请求应答

typedef struct 
{
	u8_t len[2];//包长度
	u8_t cmd;//报文类型
	u8_t date[4];
	u8_t evt1;
	u8_t crc[2];
}askEvtAckDef;//事件查询应答

typedef struct
{
	u8_t len[2];//包长度
	u8_t cmd;//报文类型
	u8_t id[4];//设备ID
	u8_t type;//文件类型
	u8_t size[2];//包大小
	u8_t crc[2];
}fileInfoReqDef;

typedef struct 
{
	u8_t len[2];//包长度
	u8_t cmd;//报文类型
	u8_t fileSize[4];//文件大小
	u8_t fileID[4];//文件ID
	u8_t packNum[2];//包数量
	u8_t crc[2];//crc16
}fileInfoAckDef;

typedef struct 
{	
	u8_t len[2];//包长度
	u8_t cmd;//报文类型
	u8_t devID[4];
	u8_t picID[4];
	u8_t pos[2];//位置
	u8_t crc[2];
}fileDataReqDef;

typedef struct 
{
	u8_t len[2];//包长度
	u8_t cmd;//报文类型
	u8_t pos[2];//对应包位置
	u8_t data[FILE_BUF_SIZE];
	u8_t crc[2];
}fileDataAckDef;

typedef struct 
{
	u8_t len[2];//包长度
	u8_t cmd;//报文类型
	u8_t devID[4];
	u8_t picID[4];
	u8_t result;//结果 0 成功 1表示文件太大
	u8_t crc[2];
}fileFinshReqDef;

typedef struct 
{
	u8_t len[2];//包长度
	u8_t cmd;//报文类型
	u8_t finsh;
	u8_t crc[2];
}fileFinshAckDef;

typedef struct
{
	u8_t len[2];//包长度
	u8_t cmd;//报文类型
	u8_t id[4];//设备id
	u8_t crc[2];
}askCycleReqDef;

typedef struct 
{
	u8_t len[2];//包长度
	u8_t cmd;//报文类型
	u8_t time[2];
	u8_t date[4];
	u8_t crc[2];
}askCycleAckDef;

typedef struct 
{
	u8_t len[2];//包长度
	u8_t cmd;//报文类型
	u8_t id[4];
	u8_t crc[2];
}modUrlReqDef;

typedef struct 
{
	u8_t len[2];//包长度
	u8_t cmd;//报文类型
	u8_t port[2];//端口
	u8_t url[32];
	u8_t crc[2];
}modUrlAckDef;

typedef struct 
{
	u8_t len[2];//包长度
	u8_t cmd;//报文类型
	u8_t id[4];
	u8_t type;//修改类型 1 更新时间 2 url
	u8_t crc[2];
}finshModReqDef;

typedef struct 
{
	u8_t len[2];//包长度
	u8_t cmd;//报文类型
	u8_t result;
	u8_t crc[2];
}finshModAckDef;


//设备注册
typedef union
{
	devRegReqDef msg;
	u8_t buf[sizeof(devRegReqDef)];
}msgDevRegReqDef;

//设置注册应答
typedef union
{
	devRegAckDef msg;
	u8_t buf[sizeof(devRegAckDef)];
}msgDevRegAckDef;

typedef union
{
	askEvtReqDef msg;
	u8_t buf[sizeof(askEvtReqDef)];
}msgAskEvtReqDef;

typedef union
{
	askEvtAckDef msg;
	u8_t buf[sizeof(askEvtAckDef)];
}msgAskEvtAckDef;

typedef union
{
	fileInfoReqDef msg;
	u8_t buf[sizeof(fileInfoReqDef)];

}msgFileInfoReqDef;

typedef union
{
	fileInfoAckDef msg;
	u8_t buf[sizeof(fileInfoAckDef)];
}msgFileInfoAckDef;

typedef union
{
	fileDataReqDef msg;
	u8_t buf[sizeof(fileDataReqDef)];
}msgFileDataReqDef;

typedef union 
{
	fileDataAckDef msg;
	u8_t buf[sizeof(fileDataAckDef)];
}msgFileDataAckDef;

typedef union
{
	fileFinshReqDef msg;
	u8_t buf[sizeof(fileFinshReqDef)];
}msgFileFinshReqDef;

typedef union
{
	fileFinshAckDef msg;
	u8_t buf[sizeof(fileFinshAckDef)];
}msgFileFinshAckDef;

typedef union
{
	askCycleReqDef msg;
	u8_t buf[sizeof(askCycleReqDef)];
}msgAskCycleReqDef;

typedef union
{
	askCycleAckDef msg;
	u8_t buf[sizeof(askCycleAckDef)];
}msgAskCycleAckDef;

typedef union
{
	modUrlReqDef msg;
	u8_t buf[sizeof(modUrlReqDef)];
}msgModUrlReqDef;

typedef union
{
	modUrlAckDef msg;
	u8_t buf[sizeof(modUrlAckDef)];
}msgModUrlAckDef;

typedef union
{
	finshModReqDef msg;
	u8_t buf[sizeof(finshModReqDef)];
}msgFinshModReqDef;

typedef union 
{
	finshModAckDef msg;
	u8_t buf[sizeof(finshModAckDef)];
}msgFinshModAckDef;
	
void update_event_mail(u16_t value);
u8_t *show_buffer_get(void);
void close_gsm_hw(void);

u8_t is_key_evt_wakeup(void);


#endif
